﻿//using FluorineFx.Json;
//using lxwmvc;
//using System;
//using System.Collections.Generic;
//using System.IO;
//using System.Net;
//using System.Security.Cryptography;
//using System.Text;
//using System.Web;

//namespace velocity_weixin
//{
//    public class FuWuHao_FuWuHao_DengLu
//    {
//        private string appId;
//        private string appSecret;

//        public FuWuHao_FuWuHao_DengLu(string appId, string appSecret)
//        {
//            this.appId = appId;
//            this.appSecret = appSecret;
//        }

//        //public class DATA
//        //{
//        //    public DateTime expires_in = DateTime.Now;
//        //    public Dictionary<string, object[]> data = new Dictionary<string, object[]>();
//        //    public string openid = "";
//        //    public string token = "";
//        //}

//        /// <summary>
//        /// 缓存信息
//        /// </summary>
//        //static Hashtable cache = Hashtable.Synchronized(new Hashtable());
//        //public static DATA getCacheToken(string key, Func<DATA> action)
//        //{
//        //    if (!cache.ContainsKey(key)) cache[key] = action();
//        //    var obj = cache[key] as DATA;
//        //    if (obj.expires_in <= DateTime.Now)
//        //    {
//        //        obj = action();
//        //        cache[key] = obj;
//        //    }
//        //    return obj;
//        //}

//        /// <summary>
//        /// 得到签名及其他信息 访问的ＵＲＬ地址要完全保持一致，否则分享失败
//        /// </summary>
//        /// <param name="url"></param>
//        /// <returns></returns>
//        public System.Collections.Hashtable GetSignPackage(string url)
//        {
//            string jsapiTicket = GetJsApiTicket();

//            dataloger.info(url);

//            //dataloger.writelog(pb.Request.Url.ToString());

//            //string url = "http://www.yunto.cc/s/" + pb.v_ss("id") + "?eqrcode=1";

//            ////lxw 20150315 带不带www都能正确分享
//            ////if (pb.Request.Url.tostr().ToLower().IndexOf("www.") == -1)
//            ////    url = stringhelper.replace(url, "//www.", "//");

//            ////if (cookieshelper.getcookie("guanxiid").toint32() > 0)
//            //url = url + "&fm=" + pb.v_ss("fm");


//            ////if (pb.Request.Url.tostr().Contains("groupmessage") && pb.Request.Url.tostr().Contains("isappinstalled"))
//            ////{
//            ////    url = url + "&from=groupmessage&isappinstalled=0";
//            ////}
//            ////if (pb.Request.Url.tostr().Contains("singlemessage") && pb.Request.Url.tostr().Contains("isappinstalled"))
//            ////{
//            ////    url = url + "&from=singlemessage&isappinstalled=0";
//            ////}


//            //dataloger.writelog(url);
//            string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
//            string nonceStr = CreateNonceStr();


//            // 这里参数的顺序要按照 key 值 ASCII 码升序排序  
//            string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";

//            //通过票据，生成签名信息
//            string signature = SHA1_Hash(rawstring);

//            System.Collections.Hashtable signPackage = new System.Collections.Hashtable();
//            signPackage.Add("appId", appId);
//            signPackage.Add("nonceStr", nonceStr);
//            signPackage.Add("timestamp", timestamp);
//            signPackage.Add("url", url);
//            signPackage.Add("signature", signature);
//            signPackage.Add("rawString", rawstring);


//            //pb["kk"] = "dasdasdasd";

//            //var has = getSignPackage();

//            //foreach (string key in signPackage.Keys)
//            //{
//            //    pb[key] = signPackage[key];
//            //}

//            return signPackage;
//        }

//        public JavaScriptObject GetUnionid(string code)
//        {
//            //第二步获取openid unionid
//            string jsonstr = StringCore.GetUrl("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code");
//            JavaScriptObject open = JavaScriptConvert.DeserializeObject(jsonstr) as JavaScriptObject;
//            return open;
//        }


//        /// <summary>
//        /// 创建随机字符串
//        /// </summary>
//        /// <returns></returns>
  
//        private string CreateNonceStr()
//        {
//            int length = 16;
//            string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//            string str = "";
//            Random rad = new Random();
//            for (int i = 0; i < length; i++)
//            {
//                str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
//            }
//            return str;
//        }


//        /// <summary>
//        /// 得到ticket 如果文件里时间 超时则重新获取  
//        /// </summary>
//        /// <returns></returns>
//        string GetJsApiTicket()
//        {
//            string accessToken = GetAccessToken();//获取系统的全局token 
//            return GetTicket(accessToken);
//        }

//        public class AccToken
//        {
//            public string access_token { get; set; }
//            public double expires_in { get; set; }
//        }

//        AccToken GetToKen()
//        {
//            string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret + "";
//            return JavaScriptConvert.DeserializeObject<AccToken>(HttpGet(url));
//        }
//        /// <summary>
//        /// 得到accesstoken 如果文件里时间 超时则重新获取 (这个token是非网页授权token)
//        /// access_token是公众号的全局唯一票据，公众号调用各接口时都需使用access_token。
//        /// 开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。
//        /// access_token的有效期目前为2个小时，需定时刷新，重复获取将导致上次获取的access_token失效。
//        /// </summary>
//        /// <returns></returns> 
//        public AccToken GetAccessToken()
//        {
//            // access_token 应该全局存储与更新，以下代码以写入到文件中做示例
//            AccToken iden = new AccToken();

//            string path = HttpContext.Current.Server.MapPath(@"/weixin/fuwuhao/"+appId+"/access_token.json");
//            try
//            {
//                if (!Directory.Exists(Path.GetDirectoryName(path)))
//                    Directory.CreateDirectory(Path.GetDirectoryName(path));
//            }
//            catch { }

//            AccToken readJSTicket = new AccToken();
//            readJSTicket.expires_in = 0;
//            if (File.Exists(path))
//            {
//                using (StreamReader sr = new StreamReader(path))
//                {
//                    readJSTicket = (AccToken)JavaScriptConvert.DeserializeObject<AccToken>(sr.ReadToEnd());                   
//                }
//            }

//            if (readJSTicket.expires_in < ConvertDateTimeInt(DateTime.Now))
//            {
//                string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret + "";
//                iden = JavaScriptConvert.DeserializeObject<AccToken>(HttpGet(url));

//                string access_token = iden.access_token;
//                if (access_token != "")
//                {
//                    iden.expires_in = ConvertDateTimeInt(DateTime.Now) + iden.expires_in;
//                    iden.access_token = access_token;

//                    string json = JavaScriptConvert.SerializeObject(iden);
//                    StreamWriterMetod(json, path);
//                }
//            }
//            else
//            {
//                iden = readJSTicket;
//            }
//            return iden;
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        public class Jsapi
//        {
//            public int errcode { get; set; }
//            public string errmsg { get; set; }
//            public string ticket { get; set; }
//            public int expires_in { get; set; }
//        }

//        /// <summary>
//        /// 通过token获取访问票据
//        /// </summary>
//        /// <param name="token"></param>
//        /// <returns></returns>
//        public string GetTicket(string token)
//        {
//            string access_ticket = "";
//            string path = HttpContext.Current.Server.MapPath(@"/weixin/fuwuhao/" + appId + "/access_ticket.json");
//            try
//            {
//                if (!Directory.Exists(Path.GetDirectoryName(path)))
//                    Directory.CreateDirectory(Path.GetDirectoryName(path));
//            }
//            catch { }

//            Jsapi readJSTicket = new Jsapi();
//            readJSTicket.expires_in = 0;
//            if (File.Exists(path))
//            {
//                using (StreamReader sr = new StreamReader(path))
//                {
//                    readJSTicket = (Jsapi)JavaScriptConvert.DeserializeObject<Jsapi>(sr.ReadToEnd());
//                }
//            }

//            if (readJSTicket.expires_in < ConvertDateTimeInt(DateTime.Now))
//            {
//                string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + token + "";
//                Jsapi api = JavaScriptConvert.DeserializeObject<Jsapi>(HttpGet(url));
//                api.expires_in = ConvertDateTimeInt(DateTime.Now) + api.expires_in;
//                access_ticket = api.ticket;

//                string json = JavaScriptConvert.SerializeObject(api);
//                StreamWriterMetod(json, path);
//            }
//            else
//            {
//                access_ticket = readJSTicket.ticket;
//            }
//            return access_ticket;
//        }


//        /// <summary>
//        /// 发起一个http请球，返回值
//        /// </summary>
//        /// <param name="url"></param>
//        /// <returns></returns>
  
//        string HttpGet(string url)
//        {
//            try
//            {
//                WebClient MyWebClient = new WebClient();
//                MyWebClient.Credentials = CredentialCache.DefaultCredentials;
//                Byte[] pageData = MyWebClient.DownloadData(url);
//                string pageHtml = System.Text.Encoding.Default.GetString(pageData);

//                dataloger.info("wx-ok:" + pageHtml);
//                return pageHtml;
//            }
//            catch (WebException webEx)
//            {
//                dataloger.info("wx-err:" + webEx.Message.ToString());
//                Console.WriteLine(webEx.Message.ToString());
//                return null;
//            }
//        }


//        /// <summary>
//        /// SHA1哈希加密算法  
//        /// </summary>
//        /// <param name="str_sha1_in"></param>
//        /// <returns></returns>
//        string SHA1_Hash(string str_sha1_in)
//        {
//            SHA1 sha1 = new SHA1CryptoServiceProvider();
//            byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(str_sha1_in);
//            byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
//            string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
//            str_sha1_out = str_sha1_out.Replace("-", "").ToLower();
//            return str_sha1_out;
//        }


//        /// <summary>  
//        /// StreamWriter写入文件方法  
//        /// </summary>  
//        private void StreamWriterMetod(string str, string patch)
//        {
//            try
//            {
//                FileStream fsFile = new FileStream(patch, FileMode.OpenOrCreate);
//                using (StreamWriter swWriter = new StreamWriter(fsFile))
//                {
//                    swWriter.WriteLine(str);
//                }
//            }
//            catch (Exception e)
//            {
//                dataloger.fatal(e.Message, e);
//                throw e;
//            }
//        }

//        /// <summary>  
//        /// 将c# DateTime时间格式转换为Unix时间戳格式  
//        /// </summary>  
//        /// <param name="time">时间</param>  
//        /// <returns>double</returns>  
//        int ConvertDateTimeInt(System.DateTime time)
//        {
//            int intResult = 0;
//            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
//            intResult = Convert.ToInt32((time - startTime).TotalSeconds);
//            return intResult;
//        }
//    }
//}
